package com.google.code.lf.commons.util;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.List;

import org.custommonkey.xmlunit.DetailedDiff;
import org.custommonkey.xmlunit.Diff;
import org.custommonkey.xmlunit.Difference;
import org.custommonkey.xmlunit.XMLAssert;
import org.junit.Assert;
import org.xml.sax.SAXException;

/**
 * Classe regroupant des méthodes utilitaires pour les tests utilisant le framework <a href="http://xmlunit.sourceforge.net">XmlUnit</a>.
 * 
 * @author gael.lorent-fonfrede
 */
public class XmlUnitHelper {
	/**
	 * Constructeur. Ne doit pas être appelé.
	 * @throws UnsupportedOperationException Toujours.
	 */
	private XmlUnitHelper() {
		throw new UnsupportedOperationException("Classe utilitaire, ne doit pas être instanciée.");
	}

	/**
	 * Compare deux fichiers xml et liste les différences sur la console.
	 * 
	 * @param referenceFile Le {@link File} de référence.
	 * @param testFile Le {@link File} à tester.
	 * @return Le nombre de différences trouvées.
	 */
	@SuppressWarnings("unchecked")
	public static int checkDifferences(final File referenceFile, final File testFile) {
		try {
			final Diff diff = new Diff(new FileReader(referenceFile), new FileReader(testFile));
			XMLAssert.assertXMLEqual(diff, diff.identical());

			final DetailedDiff detailedDiff = new DetailedDiff(diff);
			final List<Difference> allDifferences = detailedDiff.getAllDifferences();
			if ((allDifferences != null) && !allDifferences.isEmpty()) {
				System.out.println(" ----------\nDifferences found:");
				for (final Difference difference : allDifferences) {
					final String diffFound = difference.toString();
					System.out.println(" ---\n" + diffFound);
				}
			}

			return allDifferences.size();
		} catch (final FileNotFoundException e) {
			e.printStackTrace();
			Assert.fail("FileNotFoundException raised: " + e.getMessage());
		} catch (final SAXException e) {
			e.printStackTrace();
			Assert.fail("SAXException raised: " + e.getMessage());
		} catch (final IOException e) {
			e.printStackTrace();
			Assert.fail("IOException raised: " + e.getMessage());
		}

		return -1;
	}
}
